//
//  NSObject+ZXCustomerModel.m
//  qianke
//
//  Created by ZX on 2017/8/16.
//  Copyright © 2017年 ZX. All rights reserved.
//

#import "NSObject+ZXCustomerModel.h"
#import <objc/runtime.h>

@implementation NSObject (ZXCustomerModel)
+ (NSArray *)propertList
{
    unsigned int count = 0;
    //获取模型属性, 返回值是所有属性的数组 objc_property_t
    objc_property_t *propertyList = class_copyPropertyList([self class], &count);
    NSMutableArray *arr = [NSMutableArray array];
    //便利数组
    for (int i = 0; i< count; i++) {
        //获取属性
        objc_property_t property = propertyList[i];
        //获取属性名称
        const char *cName = property_getName(property);
        NSString *name = [[NSString alloc]initWithUTF8String:cName];
        //添加到数组中
        [arr addObject:name];
    }
    //释放属性组
    free(propertyList);
    return arr.copy;
}

+ (instancetype)modelSformDics:(NSDictionary *)dict
{
    id obj = [self new];
    // 遍历属性数组
    for (NSString *property in [self propertList]) {
        // 判断字典中是否包含这个key
        if (dict[property]) {
            // 使用 KVC 赋值
            [obj setValue:dict[property] forKey:property];
        }
    }
    
    return obj;
}


+(instancetype)modelWithDic:(NSDictionary*)dict{
    id objc =  [[self alloc]init];
    unsigned int count = 0;
    Ivar  *ivarPlist =class_copyIvarList(self, &count);
    for (int i=0; i<count;i++){
        
//        (1):获取到一个成员属性名
        
        Ivar ivar1 = ivarPlist[i];
        
//        (2):获取到成员名
        
        NSString *propertyName = [NSString stringWithUTF8String: ivar_getName(ivar1)];
        
//        (3.)获取到成员属性（这个返回值是c语言，所以转换了一下）
        
//        NSString *propertyType = [NSString stringWithUTF8String:ivar_getTypeEncoding(ivar1)];
        
//        （4），获取key（注意成员属性和属性的区别）
        
        NSString *key = [propertyName substringFromIndex:1];
        
//        （5），获取Value
        
        id Value= dict[key];
        
//        （6）.通过KVC进行赋值（因为Value如果为空，直接Crash，所以这里判断了一下，如果有值再去赋值）
        
        if (Value) {
            [objc setValue:Value forKey:key];//用kvc复制value不能为空
        }
       }
    return objc;
}
@end
